
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	КопироватьДанныеФормы(Параметры.Объект, Объект);
	
	ПереданныйСписокЭлементов = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(Параметры.Значение);
	ТипКонтейнера = Параметры.ТипКонтейнера;
	
	Если ТипКонтейнера = 2 Тогда
		Заголовок = Параметры.Заголовок + " (массив)";
		СписокЭлементов.ЗагрузитьЗначения(ПереданныйСписокЭлементов);
	Иначе
		Заголовок = Параметры.Заголовок + " (список значений)";
		СписокЭлементов = ПереданныйСписокЭлементов;
	КонецЕсли;
	
	СписокЭлементов.ТипЗначения = Параметры.ТипЗначения;
	
	маТипыБезПодбора = Новый Массив;
	маТипыБезПодбора.Добавить(Тип("Число"));
	маТипыБезПодбора.Добавить(Тип("Строка"));
	маТипыБезПодбора.Добавить(Тип("Дата"));
	маТипыБезПодбора.Добавить(Тип("Неопределено"));
	маТипыБезПодбора.Добавить(Тип("Тип"));
	маТипыБезПодбора.Добавить(Тип("ВидДвиженияНакопления"));
	маТипыБезПодбора.Добавить(Тип("ВидДвиженияБухгалтерии"));
	маТипыБезПодбора.Добавить(Тип("ВидСчета"));
	маТипыБезПодбора.Добавить(Тип("УникальныйИдентификатор"));
	маТипыБезПодбора.Добавить(Тип("NULL"));
	ТипыБезПодбора = Новый ОписаниеТипов(маТипыБезПодбора);
	
	маТипы = Параметры.ТипЗначения.Типы();
	Элементы.СписокЭлементовПодбор.Видимость = Истина;
	Для Каждого Тип Из маТипы Цикл
		Если ТипыБезПодбора.СодержитТип(Тип) Тогда
			Элементы.СписокЭлементовПодбор.Видимость = Ложь;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Функция ПолноеИмяФормы(ИмяФормы)
	Возврат СтрШаблон("%1.Форма.%2", Объект.ПутьМетаданных, ИмяФормы);
КонецФункции

&НаСервере
Функция ПолучитьВозвращаемоеЗначение()
	
	Если ТипКонтейнера = 2 Тогда
		Возврат РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(СписокЭлементов.ВыгрузитьЗначения());
	КонецЕсли;
	
	Возврат РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(СписокЭлементов);
	
КонецФункции

&НаКлиенте
Процедура КомандаОК(Команда)

	ВозвращаемоеЗначение = Новый Структура("Значение", ПолучитьВозвращаемоеЗначение());
	
	Закрыть(ВозвращаемоеЗначение);
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаОчистить(Команда)
	СписокЭлементов.Очистить();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьЗначение()
	
	Значение = Элементы.СписокЭлементов.ТекущиеДанные.Значение;
	Если ТипЗнч(Значение) = Тип("Тип") Тогда

		ПараметрыОповещения = Новый Структура("Строка", Элементы.СписокЭлементов.ТекущаяСтрока);
		//@skip-warning
		ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияТипа", ЭтаФорма, ПараметрыОповещения);
		
		Если ТипЗнч(Значение) <> Тип("Тип") Тогда
			Значение = Тип("Неопределено");
		КонецЕсли;
		
		ПараметрыОткрытия = Новый Структура("Объект, ТипЗначения", Объект, Значение);
		ОткрытьФорму(ПолноеИмяФормы("РедактированиеТипа"), ПараметрыОткрытия, ЭтаФорма, Истина, , , ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		
	ИначеЕсли ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда

		ПараметрыОповещения = Новый Структура("Строка", Элементы.СписокЭлементов.ТекущаяСтрока);
		//@skip-warning
		ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияТипа", ЭтаФорма, ПараметрыОповещения);
		
		ПараметрыОткрытия = Новый Структура("Объект, Значение", Объект, Значение);
		ОткрытьФорму(ПолноеИмяФормы("РедактированиеУникальногоИдентификатора"), ПараметрыОткрытия, ЭтаФорма, Истина, , , ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокЭлементовЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Значение = Элементы.СписокЭлементов.ТекущиеДанные.Значение;
	
	ТипРедактируемогоЗначения = ТипЗнч(Значение);
	
	Если ТипРедактируемогоЗначения = Тип("Тип") ИЛИ ТипРедактируемогоЗначения = Тип("УникальныйИдентификатор") Тогда
		РедактироватьЗначение();
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокЭлементовЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ВыбранноеЗначение = Тип("Тип") Тогда
		СписокЭлементов.НайтиПоИдентификатору(Элементы.СписокЭлементов.ТекущаяСтрока).Значение = Тип("Неопределено");
		РедактироватьЗначение();
	ИначеЕсли ВыбранноеЗначение = Тип("УникальныйИдентификатор") Тогда
		СписокЭлементов.НайтиПоИдентификатору(Элементы.СписокЭлементов.ТекущаяСтрока).Значение = Новый УникальныйИдентификатор;
		РедактироватьЗначение();
	КонецЕсли;
	
КонецПроцедуры

Процедура ОкончаниеРедактированияТипа(Результат, ПараметрыОповещения) Экспорт
	Перем Значение;
	
	Если Результат <> Неопределено Тогда
		
		Если Результат.Свойство("Значение", Значение) Тогда
			
			СписокЭлементов.НайтиПоИдентификатору(ПараметрыОповещения.Строка).Значение = Значение;
			
		Иначе
		
			СписокЭлементов.НайтиПоИдентификатору(ПараметрыОповещения.Строка).Значение = Тип(Результат.ОписаниеКонтейнера.ИмяТипа);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#Область ЗаполнениеСпискаЗначений
&НаКлиенте
Процедура КомандаЗаполнитьИзБуфера(Команда)
	Если Не СписокЭлементов.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
		Возврат;
	КонецЕсли;
	ОписаниеОповещения = Новый ОписаниеОповещения("КомандаЗаполнитьИзБуфераЗавершение", ЭтотОбъект);
	УИ_БуферОбменаКлиент.НачатьПолучениеСтрокиИзБуфера(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаполнитьИзБуфераЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Возврат;
	КонецЕсли;
	
	СписокЭлементов.Очистить();
	
	ТекстДокумент = Новый ТекстовыйДокумент();
	ТекстДокумент.УстановитьТекст(Результат);
	КоличествоСтрок = ТекстДокумент.КоличествоСтрок();
	Для й = 1 По КоличествоСтрок Цикл
		СтрокаТекста = ТекстДокумент.ПолучитьСтроку(й);
		СписокЭлементов.Добавить(СтрокаТекста);
	КонецЦикла;
		
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаполнитьИзФайлов(Команда)

	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	Фильтр = НСтр("ru = 'Текстовый документ';") + "(*.txt)|*.txt|" + 
			 НСтр("ru = 'XML строка';") + "(*.xml)|*.xml";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.МножественныйВыбор = Истина;
	ДиалогОткрытияФайла.Заголовок = "Выберите файлы";

	ОписаниеОповещения = Новый ОписаниеОповещения("КомандаЗаполнитьИзФайловЗавершение", ЭтотОбъект);

	ДиалогОткрытияФайла.Показать(ОписаниеОповещения);

КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаполнитьИзФайловЗавершение(ВыбранныеФайлы, Дополнительныепараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Расширение = Прав(ВыбранныеФайлы[0], 3);	
	МассивДвоичныхДанных = Новый Массив();
	Если ТипЗнч(ВыбранныеФайлы) = Тип("Массив") Тогда
		Для Каждого ТекСтрока Из ВыбранныеФайлы Цикл
			ДвоичныеДанные = Новый ДвоичныеДанные(ТекСтрока);
			МассивДвоичныхДанных.Добавить(ДвоичныеДанные);
		КонецЦикла;
		АдресХранилища = ПоместитьВоВременноеХранилище(МассивДвоичныхДанных, УникальныйИдентификатор);
		ЗаполнитьСписокИзФайловНаСервере(АдресХранилища, Расширение);
	КонецЕсли;
		
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокИзФайловНаСервере(АдресХранилища, Расширение)
	
	СписокЭлементов.Очистить();
	
	МассивФайлов = ПолучитьИзВременногоХранилища(АдресХранилища);
	Для Каждого ТекФайл Из МассивФайлов Цикл
		
		ТекстИзФайла = ПолучитьСтрокуИзДвоичныхДанных(ТекФайл);
				
		Если Расширение = "txt" Тогда
			ТекстДок = Новый ТекстовыйДокумент;
			ТекстДок.УстановитьТекст(ТекстИзФайла);
			
			КоличествоСтрок = ТекстДок.КоличествоСтрок();
			Для й = 1 По КоличествоСтрок Цикл
				СтрокаТекста = ТекстДок.ПолучитьСтроку(й);
				СписокЭлементов.Добавить(СтрокаТекста);
			КонецЦикла;
		ИначеЕсли Расширение = "xml" Тогда
			СписокЗнач = УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(ТекстИзФайла);
			Если ТипЗнч(СписокЗнач) = Тип("СписокЗначений") И СписокЗнач.ТипЗначения = СписокЭлементов.ТипЗначения Тогда
				Для Каждого ТекСтрока Из СписокЗнач Цикл
					ЗаполнитьЗначенияСвойств(СписокЭлементов.Добавить(), ТекСтрока);
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

#КонецОбласти

#Область ПередачаСпискаЗначений

&НаКлиенте
Процедура КомандаПередатьВБуферОбмена(Команда)
		ОписаниеОповещения = Новый ОписаниеОповещения("КомандаПередатьВБуферОбменаЗавершение",ЭтотОбъект);
		УИ_БуферОбменаКлиент.НачатьКопированиеСтрокиВБуфер(СформироватьТекстДляКопирования(),ОписаниеОповещения);
КонецПроцедуры

&НаСервере
Функция СформироватьТекстДляКопирования()
	ТекстДок = Новый ТекстовыйДокумент();
	Для Каждого ТекСтрока Из СписокЭлементов Цикл
		ТекстДок.ДобавитьСтроку(СокрЛП(ТекСтрока));
	КонецЦикла;	
	
	Возврат ТекстДок.ПолучитьТекст();
КонецФункции

&НаКлиенте
Процедура КомандаПередатьВБуферОбменаЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Истина Тогда
		Состояние("Скопировано в буфер обмена");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура КомандаПередатьВСтрокуXML(Команда)
	
	Режим = РежимДиалогаВыбораФайла.Сохранение;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	Фильтр = НСтр("ru = 'XML';") + "(*.xml)|*.xml";
	ДиалогОткрытияФайла.Расширение = "xml";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.Заголовок = "Сохранить файл";

	ДополнительныеПараметры = Новый Структура("АдресФайла", ПолучитьФайлСпискаЗначенийВСтрокуВнутр());
	
	ОписаниеОповещения = Новый ОписаниеОповещения("КомандаПередатьВСтрокуXMLЗавершение", 
												  ЭтотОбъект,
												  ДополнительныеПараметры);

	ДиалогОткрытияФайла.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура КомандаПередатьВСтрокуXMLЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДополнительныеПараметры.АдресФайла);
	ДвоичныеДанные.Записать(Результат[0]);	
КонецПроцедуры

&НаСервере
Функция ПолучитьФайлСпискаЗначенийВСтрокуВнутр()
	СтрокаXML = УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(СписокЭлементов);
	АдресФайла = ПолучитьДвоичныеДанныеИзСтроки(СтрокаXML);
	Возврат ПоместитьВоВременноеХранилище(АдресФайла, УникальныйИдентификатор);	
КонецФункции

#КонецОбласти

&НаКлиенте
Процедура КомандаОткрытьСправку(Команда)
	ОткрытьСправкуФормы();
КонецПроцедуры